package com.wh.springboot.controller;

import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wh.springboot.common.Result;
import com.wh.springboot.common.entity.CovidGlobalData;
import com.wh.springboot.service.GlobalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

@RestController
@RequestMapping("/global_data")
public class GlobalDateAdminController {
    @Autowired
    private GlobalService globalService;

    /**
     * 模糊查询 带有分页
     */
    @GetMapping("/page")
    private Result listDataByPage(@RequestParam Integer pageNum,
                                  @RequestParam Integer pageSize,
                                  @RequestParam(defaultValue = "") String name,
                                  @RequestParam(defaultValue = "0") Integer value
    ) {
        //1.创建分页的对象 当前页 每页限制大小

        //2.创建模糊查询条件
        QueryWrapper<CovidGlobalData> queryWrapper = new QueryWrapper<>();

//        //输入的值是非空的话，再执行
        if (!"".equals(name)) {
            queryWrapper.like("name", name);
        }

        //3.疫情数据确诊最多的排在最上面
        queryWrapper.orderByDesc("value");//降序
        //4.查询数据库
        //5.返回数据封装

        return Result.success(globalService.page(new Page<>(pageNum, pageSize), queryWrapper));
    }


    /**
     *  查询所有数据
     * @return
     */
    @GetMapping
    public Result findAll() {
        return Result.success(globalService.list());
    }

    /**
     * 新增和修改
     * @param covidGlobalData
     * @return
     */
    @PostMapping
    public Result save(@RequestBody CovidGlobalData covidGlobalData) {
        //新增或者更新
        return Result.success(globalService.saveOrUpdate(covidGlobalData));
    }


    /**
     * 根据id查询
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(globalService.getById(id));
    }

    /**
     * 删除数据
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")//id 与下面的id必须一致
    //    @PathVariable 表示 url 这个参数
    public Result delete(@PathVariable Integer id) {
        return Result.success(globalService.removeById(id));
    }

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @DeleteMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {
        return Result.success(globalService.removeByIds(ids)) ;
    }

    /**
     * 导出接口
     */
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception {
        // 从数据库查询出所有的数据
        List<CovidGlobalData> list = globalService.list();
        // 通过工具类创建writer 写出到磁盘路径
        // ExcelWriter writer = ExcelUtil.getWriter(filesUploadPath + "/用户信息.xlsx");

        // 在内存操作，写出到浏览器
        ExcelWriter writer = ExcelUtil.getWriter(true);

        //自定义标题别名
        writer.addHeaderAlias("name", "全球地区");
        writer.addHeaderAlias("value", "确诊人数");

        // 一次性写出list内的对象到excel，使用默认样式，强制输出标题
        writer.write(list, true);

        // 设置浏览器响应的格式
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        //URLEncoder的方式进行编码
        String fileName = URLEncoder.encode("全球新冠疫情信息", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

        ServletOutputStream out = response.getOutputStream();
        //刷新数据到输出流当中
        writer.flush(out, true);
        //此处记得关闭输出Servlet流
        out.close();
        // 关闭writer，释放内存
        writer.close();
    }

    /**
     * excel 导入
     *
     * @param file
     * @throws Exception
     */
    @PostMapping("/import")
    public Result imp(MultipartFile file) throws Exception {
        InputStream inputStream = file.getInputStream();
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        // 方式1：(推荐) 通过 javabean的方式读取Excel内的对象，但是要求表头必须是英文，跟javabean的属性要对应起来
//        List<User> list = reader.readAll(User.class);

        // 方式2：忽略表头的中文，直接读取表的内容
        List<CovidGlobalData> list = reader.read(0, 1, CovidGlobalData.class);
        System.out.println(list);
//        List<User> users = CollUtil.newArrayList();
//        for (List<Object> row : list) {
//            User user = new User();
//            user.setUsername(row.get(0).toString());
//            user.setPassword(row.get(1).toString());
//            user.setNickname(row.get(2).toString());
//            user.setEmail(row.get(3).toString());
//            user.setPhone(row.get(4).toString());
//            user.setAddress(row.get(5).toString());
//            user.setAvatarUrl(row.get(6).toString());
//            users.add(user);
//        }

        globalService.saveBatch(list);
        return Result.success(true);
    }
}
